package DigitalNetwork;

import java.util.ArrayList;
import java.util.ListIterator;

/**
 * A digitalis halozatban logika "vagy" muveletet megvalosito kapu-elem.
 * <p>
 *
 * </p>
 *
 * @author Ableda Peter
 * @author Andrasi Istvan
 * @author Kamaras Karoly
 * @author Pora Szilard
 *
 * @version 1.0 Build 2011.04.16
 */
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public class ORGate extends Gate {

    /** [Konstruktor]
	 * Letrehozza a be- es kimeneti portokat.
	 *
	 * @param _ID Az kapu neve.
	 * @param inputNumber A kapu bemeneteinek szama.
     * @param x Az elem poziciojanak vizszintes komponense.
     * @param y Az elem poziciojanak fuggoleges komponense.
	 */
	//==========================================================================
    public ORGate(String _ID, int inputNumber, int x, int y) {
        super(x,y);
        // Beallitjuk az ID-t.
		this.ID = _ID;

		// Letrehozzuk a bementi portok listajat.
		this.inputs = new ArrayList<PortIn>();
		// Letrehozzuk a megfelelo szamu bemenetet.
		for (int i = 0; i < inputNumber; i++) {
			this.inputs.add(new PortIn(this.ID + "_i" + i, this));
		}

		// Letrehozzuk a kimenti portok listajat.
		this.outputs = new ArrayList<PortOut>();
		// Letrehozzuk a kimenetet.
		outputs.add(new PortOut(this.ID + "_o0", this));

		Main.printMessage("#" + this.getID() + " OR kapu letrehozva");
    }
	//==========================================================================

	/**
	 * Frissiti a kapu kimenetet a bemenetei alapjan.
	 * <p>
	 *
	 * </p>
	 */
	@Override
	//==========================================================================
	public void updateOutput() {
        boolean result = false;

		// Lekerdezzuk a bemeneti ertekeket.
		ListIterator<PortIn> iI = inputs.listIterator();
		while (iI.hasNext()) {
			PortIn P = iI.next();
			// Minden bemeneti erteket osszeeselunk.
			result = result || P.getState();
		}

		// Frissitjuk a kimenetet.
		outputs.get(0).setState(result);
	}
	//==========================================================================

    /**
     * Vissza adja az adott elem tipusat.
	 *
	 * @return String Az elem tipusa.
	 */
	@Override
	//==========================================================================
	public String getType() {
		return "ORGate";
	}
	//==========================================================================
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
